package cn.stylefeng.guns.sys.core.util;
import java.io.*;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;

public class ZipUtil {

    private static final int buffer = 2048;
    /**
     * 解压Zip文件
     * @param path 文件目录
     */
//    public static void unZip(String path)
//    {
//        int count = -1;
//        String savepath = "";
//        File file = null;
//        InputStream is = null;
//        FileOutputStream fos = null;
//        BufferedOutputStream bos = null;
//        savepath = path.substring(0, path.lastIndexOf(".")) + File.separator; //保存解压文件目录
//        new File(savepath).mkdir(); //创建保存目录
//        ZipFile zipFile = null;
//        try
//        {
//            zipFile = new ZipFile(path,"gbk"); //解决中文乱码问题
//            Enumeration<?> entries = zipFile.getEntries();
//            while(entries.hasMoreElements())
//            {
//                byte buf[] = new byte[buffer];
//                ZipEntry entry = (ZipEntry)entries.nextElement();
//                String filename = entry.getName();
//                boolean ismkdir = false;
//                if(filename.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹
//                    ismkdir = true;
//                }
//                filename = savepath + filename;
//                if(entry.isDirectory()){ //如果是文件夹先创建
//                    file = new File(filename);
//                    file.mkdirs();
//                    continue;
//                }
//                file = new File(filename);
//                if(!file.exists()){ //如果是目录先创建
//                    if(ismkdir){
//                        new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); //目录先创建
//                    }
//                }
//                file.createNewFile(); //创建文件
//                is = zipFile.getInputStream(entry);
//                fos = new FileOutputStream(file);
//                bos = new BufferedOutputStream(fos, buffer);
//                while((count = is.read(buf)) > -1)
//                {
//                    bos.write(buf, 0, count);
//                }
//                bos.flush();
//                bos.close();
//                fos.close();
//                is.close();
//            }
//            zipFile.close();
//        }catch(IOException ioe){
//            ioe.printStackTrace();
//        }finally{
//            try{
//                if(bos != null){
//                    bos.close();
//                }
//                if(fos != null) {
//                    fos.close();
//                }
//                if(is != null){
//                    is.close();
//                }
//                if(zipFile != null){
//                    zipFile.close();
//                }
//            }catch(Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }

    /**
     * 解压到指定目录
     */
    public static void unZipFiles(String zipPath,String descDir)throws IOException
    {
        unZipFiles(new File(zipPath), descDir);
    }
    /**
     * 解压文件到指定目录
     */
    @SuppressWarnings("rawtypes")
    public static String unZipFiles(File zipFile,String descDir)throws IOException
    {
        File pathFile = new File(descDir);
        String path="";
        if(!pathFile.exists())
        {
            pathFile.mkdirs();
        }
        //解决zip文件中有中文目录或者中文文件
        ZipFile zip = new ZipFile(zipFile, String.valueOf(Charset.forName("GBK")));
        for(Enumeration entries = zip.getEntries(); entries.hasMoreElements();)
        {
            ZipEntry entry = (ZipEntry)entries.nextElement();
            String zipEntryName = entry.getName();
            InputStream in = zip.getInputStream(entry);
            String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
            //判断路径是否存在,不存在则创建文件路径
            File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
            if(!file.exists())
            {
                file.mkdirs();
            }
            //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
            if(new File(outPath).isDirectory())
            {
                continue;
            }
            //输出文件路径信息
            System.out.println(outPath);
            path=outPath;
            OutputStream out = new FileOutputStream(outPath);
            byte[] buf1 = new byte[1024];
            int len;
            while((len=in.read(buf1))>0)
            {
                out.write(buf1,0,len);
            }
            in.close();
            out.close();
        }
        System.out.println("******************解压完毕********************");
        return path;
    }
}
